home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / vol_200 / 286_01 / circ.asm < prev    next >
Assembly Source File  |  1989-05-23  |  6KB  |  392 lines

  1. ;
  2. oa    equ    4
  3.  
  4. DGROUP    group    _DATA
  5. _DATA    segment word public 'DATA'
  6.     assume    ds:DGROUP
  7.  
  8.     extrn    _ARCSPEC:word,_DOTVALUE:word
  9.     extrn    _LASTX:word, _LASTY:word, _ARCSTTX:word, _ARCSTTY:word
  10.     extrn    _ARCENDX:word, _ARCENDY:word
  11.     extrn    wrtvec:word
  12.     extrn    _WINX1:word,_WINX2:word,_WINY1:word,_WINY2:word
  13.  
  14.     public    _cirsty
  15. cirx    dw    ?
  16. ciry    dw    ?
  17. cird    dw    ?
  18. incr1    dw    ?
  19. incr2    dw    ?
  20. _cirsty dw    ?
  21. cirptr    dw    ?
  22. cirptra dw    ?
  23. oldx    dw    ?
  24. oldy    dw    ?
  25. _DATA    ends
  26.  
  27. _TEXT    segment byte public 'CODE'
  28.     assume    cs:_TEXT,ds:DGROUP
  29.     extrn    $calc:near
  30.  
  31.     public    _circ,_setcptr
  32.     public    _seteptr,_wrtept,_wrtepta
  33.  
  34. _setcptr proc     near     ; public to c
  35.     mov    bx,sp
  36.     shr    word ptr SS:[bx+oa-2],1
  37.     jnc    short scp1
  38.     mov    cirptr,offset arc1pt
  39.     mov    cirptra,offset arc1pt
  40.     ret
  41. scp1:    mov    cirptr,offset cir_pt
  42.     mov    cirptra,offset arc1pt
  43.     ret
  44. _setcptr endp
  45.  
  46. _seteptr proc     near     ; public to c
  47.     mov    bx,sp
  48.     shr    word ptr SS:[bx+oa-2],1
  49.     jnc    short sep1
  50.     mov    cirptr,offset eac1pt
  51.     mov    cirptra,offset eac1pt
  52.     ret
  53. sep1:    mov    cirptr,offset ell_pt
  54.     mov    cirptra,offset eac1pt
  55.     ret
  56. _seteptr endp
  57.  
  58. _wrtept proc    near    ; public to c
  59.     jmp    cirptr
  60. _wrtept endp
  61.  
  62. _wrtepta proc     near     ; public to c
  63.     jmp    cirptra
  64. _wrtepta endp
  65.  
  66. $lcp    proc    near
  67.     add    ax,[bp+oa+4]
  68.     add    bx,[bp+oa+6]
  69.     mov    di,ax
  70.     and    di,0fh
  71.     call    $calc
  72.     mov    es,ax
  73.     shl    di,1
  74.     mov    ax,_DOTVALUE[di]
  75.     jmp    wrtvec
  76. $lcp    endp
  77.  
  78. $lap    proc    near
  79.     add    ax,[bp+oa+4]
  80.     add    bx,[bp+oa+6]
  81.     cmp    ax,_WINX1
  82.     jb    short leave
  83.     cmp    ax,_WINX2
  84.     ja    short leave
  85.     cmp    bx,_WINY1
  86.     jb    short leave
  87.     cmp    bx,_WINY2
  88.     ja    short leave
  89.     mov    di,ax
  90.     and    di,0fh
  91.     call    $calc
  92.     mov    es,ax
  93.     shl    di,1
  94.     mov    ax,_DOTVALUE[di]
  95.     jmp    wrtvec
  96. leave:    ret
  97. $lap    endp
  98.  
  99. cir_pt    proc    near    ; public to c
  100.     push    bp
  101.     mov    bp,sp
  102.     push    si
  103.     push    di
  104.     mov    ax,[bp+oa+2]
  105.     mov    bx,[bp+oa]
  106.     call    $lcp
  107.     mov    ax,[bp+oa]
  108.     mov    bx,[bp+oa+2]
  109.     neg    bx
  110.     call    $lcp
  111.     mov    ax,[bp+oa]
  112.     neg    ax
  113.     mov    bx,[bp+oa+2]
  114.     call    $lcp
  115.     mov    ax,[bp+oa+2]
  116.     neg    ax
  117.     mov    bx,[bp+oa]
  118.     neg    bx
  119.     call    $lcp
  120.     mov    ax,[bp+oa]
  121.     mov    bx,[bp+oa+2]
  122.     call    $lcp
  123.     mov    ax,[bp+oa+2]
  124.     mov    bx,[bp+oa]
  125.     neg    bx
  126.     call    $lcp
  127.     mov    ax,[bp+oa]
  128.     neg    ax
  129.     mov    bx,[bp+oa+2]
  130.     neg    bx
  131.     call    $lcp
  132.     mov    ax,[bp+oa+2]
  133.     neg    ax
  134.     mov    bx,[bp+oa]
  135.     call    $lcp
  136.     pop    di
  137.     pop    si
  138.     pop    bp
  139.     ret
  140. cir_pt    endp
  141.  
  142. arc1pt    proc    near        ; public to c
  143.     push    bp
  144.     mov    bp,sp
  145.     push    si
  146.     push    di
  147.     test    byte ptr _ARCSPEC,04h
  148.     jz    short a1pt1
  149.     mov    ax,[bp+oa+2]
  150.     mov    bx,[bp+oa]
  151.     call    $lap
  152. a1pt1:    test    byte ptr _ARCSPEC,01h
  153.     jz    short a1pt2
  154.     mov    ax,[bp+oa]
  155.     mov    bx,[bp+oa+2]
  156.     neg    bx
  157.     call    $lap
  158. a1pt2:    test    byte ptr _ARCSPEC,10h
  159.     jz    short a1pt3
  160.     mov    ax,[bp+oa]
  161.     neg    ax
  162.     mov    bx,[bp+oa+2]
  163.     call    $lap
  164. a1pt3:    test    byte ptr _ARCSPEC,40h
  165.     jz    short arc1p1
  166.     mov    ax,[bp+oa+2]
  167.     neg    ax
  168.     mov    bx,[bp+oa]
  169.     neg    bx
  170.     call    $lap
  171. arc1p1: test    byte ptr _ARCSPEC,08h
  172.     jz    short a1pt4
  173.     mov    ax,[bp+oa]
  174.     mov    bx,[bp+oa+2]
  175.     call    $lap
  176. a1pt4:    test    byte ptr _ARCSPEC,02h
  177.     jz    short a1pt5
  178.     mov    ax,[bp+oa+2]
  179.     mov    bx,[bp+oa]
  180.     neg    bx
  181.     call    $lap
  182. a1pt5:    test    byte ptr _ARCSPEC,80h
  183.     jz    short a1pt6
  184.     mov    ax,[bp+oa]
  185.     neg    ax
  186.     mov    bx,[bp+oa+2]
  187.     neg    bx
  188.     call    $lap
  189. a1pt6:    test    byte ptr _ARCSPEC,20h
  190.     jz    short a1pt7
  191.     mov    ax,[bp+oa+2]
  192.     neg    ax
  193.     mov    bx,[bp+oa]
  194.     call    $lap
  195. a1pt7:    pop    di
  196.     pop    si
  197.     pop    bp
  198.     ret
  199. arc1pt    endp
  200.  
  201. ;    circ(centerx,centery,radius,style,pnt1,pnt2)
  202. ;    int    cneterx,centery,radius,style;
  203. ;    struct    cpoint *pnt1, *pnt2;
  204. ;
  205. ;    draw a circle or arc with center at (centerx,centery)
  206. _circ    proc    near    ; public to c
  207.     push    bp
  208.     mov    bp,sp
  209.     mov    cx,[bp+oa+6]
  210.     mov    _cirsty,cx
  211.     mov    cx,0
  212.     mov    cirx,cx
  213.     mov    ax,[bp+oa+4]
  214.     mov    ciry,ax
  215.     push    [bp+oa+2]
  216.     push    [bp+oa]
  217.     push    ax
  218.     push    cx
  219.     shl    ax,1
  220.     mov    bx,3
  221.     sub    bx,ax
  222.     mov    cird,bx
  223.     mov    incr1,6
  224.     shl    ax,1
  225.     mov    bx,10
  226.     sub    bx,ax
  227.     mov    incr2,bx
  228.     rol    _cirsty,1
  229.     jnc    short cir1
  230.     mov    cx,_ARCSPEC
  231.     mov    [bp+oa],cx
  232.     and    _ARCSPEC,055h
  233.     call    cirptra
  234.     mov    cx,[bp+oa]
  235.     mov    _ARCSPEC,cx
  236.     jmp    short cir1
  237. cir4:    rol    _cirsty,1
  238.     jnc    short cir1
  239.     call    cirptr
  240. cir1:    add    sp,4
  241.     mov    ax,cirx
  242.     mov    oldx,ax
  243.     mov    ax,ciry
  244.     mov    oldy,ax
  245.     mov    ax,cird
  246.     test    ax,ax
  247.     jns    cir2
  248.     add    ax,incr1
  249.     add    incr2,4
  250.     jmp    short cir3
  251. cir2:    add    ax,incr2
  252.     add    incr2,8
  253.     dec    ciry
  254. cir3:    add    incr1,4
  255.     mov    cird,ax
  256.     inc    cirx
  257. ;
  258.     mov    ax,0ffffh
  259.     mov    bx,[bp+oa+8]
  260.     test    ax,[bx]
  261.     jnz    acir1
  262.     mov    cx,cirx
  263.     mov    _ARCSTTX,cx
  264.     mov    cx,ciry
  265.     mov    _ARCSTTY,cx
  266.     mov    cx,_ARCSPEC
  267.     or    cx,[bx+4]
  268.     mov    _ARCSPEC,cx
  269.     test    ax,[bx+2]
  270.     jz    acir2
  271.     xor    cx,[bx+4]
  272.     mov    _ARCSPEC,cx
  273.     mov    cx,oldx
  274.     mov    _ARCSTTX,cx
  275.     mov    cx,oldy
  276.     mov    _ARCSTTY,cx
  277. acir2:
  278. acir1:    dec    word ptr [bx]
  279.     mov    bx,[bp+oa+10]
  280.     test    ax,[bx]
  281.     jnz    acir3
  282.     mov    cx,cirx
  283.     mov    _ARCENDX,cx
  284.     mov    cx,ciry
  285.     mov    _ARCENDY,cx
  286.     mov    cx,_ARCSPEC
  287.     or    cx,[bx+4]
  288.     mov    _ARCSPEC,cx
  289.     test    ax,[bx+2]
  290.     jz    acir4
  291.     xor    cx,[bx+4]
  292.     mov    _ARCSPEC,cx
  293.     mov    cx,oldx
  294.     mov    _ARCENDX,cx
  295.     mov    cx,oldy
  296.     mov    _ARCENDY,cx
  297. acir4:
  298. acir3:    dec    word ptr [bx]
  299.     mov    ax,cirx
  300.     mov    bx,ciry
  301.     push    bx
  302.     push    ax
  303.     cmp    ax,bx
  304.     jb    tocir4
  305.     ja    cir5
  306.     mov    oldx,ax
  307.     mov    oldy,bx
  308.     rol    _cirsty,1
  309.     jnc    short cir5
  310.     mov    cx,_ARCSPEC
  311.     mov    [bp+oa],cx
  312.     and    _ARCSPEC,0aah
  313.     call    cirptra
  314.     mov    cx,[bp+oa]
  315.     mov    _ARCSPEC,cx
  316. cir5:    mov    ax,oldx
  317.     mov    _LASTX,ax
  318.     mov    ax,oldy
  319.     mov    _LASTY,ax
  320.     mov    sp,bp
  321.     pop    bp
  322.     ret
  323. tocir4: jmp    cir4
  324. _circ    endp
  325.  
  326. ell_pt    proc    near    ; public to c
  327.     push    bp
  328.     mov    bp,sp
  329.     push    si
  330.     push    di
  331.     mov    ax,[bp+oa]
  332.     mov    bx,[bp+oa+2]
  333.     neg    bx
  334.     call    $lcp
  335.     mov    ax,[bp+oa]
  336.     neg    ax
  337.     mov    bx,[bp+oa+2]
  338.     call    $lcp
  339.     mov    ax,[bp+oa]
  340.     mov    bx,[bp+oa+2]
  341.     call    $lcp
  342.     mov    ax,[bp+oa]
  343.     neg    ax
  344.     mov    bx,[bp+oa+2]
  345.     neg    bx
  346.     call    $lcp
  347.     pop    di
  348.     pop    si
  349.     pop    bp
  350.     ret
  351. ell_pt    endp
  352.  
  353. eac1pt    proc    near    ; public to c
  354.     push    bp
  355.     mov    bp,sp
  356.     push    si
  357.     push    di
  358.     rol    _cirsty,1
  359.     jnc    ea1a2
  360.     test    _ARCSPEC,01h
  361.     jz    short eac11
  362.     mov    ax,[bp+oa]
  363.     mov    bx,[bp+oa+2]
  364.     neg    bx
  365.     call    $lap
  366. eac11:    test    _ARCSPEC,10h
  367.     jz    short ea1p1
  368.     mov    ax,[bp+oa]
  369.     neg    ax
  370.     mov    bx,[bp+oa+2]
  371.     call    $lap
  372. ea1p1:    test    _ARCSPEC,08h
  373.     jz    short ea1a1
  374.     mov    ax,[bp+oa]
  375.     mov    bx,[bp+oa+2]
  376.     call    $lap
  377. ea1a1:    test    _ARCSPEC,80h
  378.     jz    short ea1a2
  379.     mov    ax,[bp+oa]
  380.     neg    ax
  381.     mov    bx,[bp+oa+2]
  382.     neg    bx
  383.     call    $lap
  384. ea1a2:    pop    di
  385.     pop    si
  386.     pop    bp
  387.     ret
  388. eac1pt    endp
  389.  
  390. _TEXT    ends
  391.     end
  392.